home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 24 / Amiga Format AFCD24 (Feb 1998, Issue 108).iso / -in_the_mag- / emulation / -otherstuff- / amiganpi / src_blitz / fram.asc < prev    next >
Text File  |  1998-01-05  |  4KB  |  222 lines

  1. ; frame handling
  2.  
  3. #SYN=$16
  4. #DLE=$10
  5. #STX=$02
  6. #ETX=$03
  7.  
  8. Function read_frame{buff.l}
  9.  ;buff is the address to a buffer
  10.  ;return -1 if frame error
  11.  ;return -2 (#TIMEOUT) if timeout (at current time, this could also signal an abort)
  12.  
  13.  timeout=False
  14.  buf.w=#SYN                   ; a byte type will not return `-1'
  15.  i=0                          ; a `-1' is used by GetByte to indicate timeout
  16.  org.l=buff;                  ; a `-2' is used by GetByte to indicate abort
  17.  fcs.l=0;                     ; currently timeouts and aborts are not differentiated
  18.  fcs_rec.l=0;
  19.  fcs_rec2.l=0;
  20.  
  21.  While buf=#SYN
  22.   buf=GetByte{}
  23.  Wend
  24.  If buf=#DLE
  25.   buf=GetByte{}
  26.   If buf=#STX
  27.    Repeat
  28.     buf=GetByte{}
  29.     If buf<0
  30.      timeout=True
  31.     Else
  32.      If buf=#DLE
  33.       buf=GetByte{}
  34.       Select buf
  35.       Case -1
  36.        timeout=True
  37.       Case -2
  38.        timeout=True
  39.       Case #ETX
  40.        fcscalc{&fcs,Chr$(buf)}
  41.        fcs_rec=GetByte{}
  42.        If fcs_rec<0
  43.         timeout=True
  44.        Else
  45.         fcs_rec2=GetByte{}
  46.         If fcs_rec2<0
  47.          timeout=True
  48.         Else
  49.          fcs_rec=(fcs_rec2 ASL 8)+fcs_rec
  50.         EndIf
  51.        EndIf
  52.        If fcs_rec&$ffff=fcs&$ffff Then Function Return i
  53.        Notify_BadCRC{Right$(Hex$(fcs_rec),4),Right$(Hex$(fcs),4)}
  54.        Function Return -1
  55.       Case #DLE
  56.        Poke.b buff,buf
  57.        buff+1
  58.        fcscalc{&fcs,Chr$(buf)}
  59.        i+1
  60.       Default
  61.        Notify_BadFrame{}
  62.        Function Return -1
  63.       End Select
  64.      Else
  65.       Poke.b buff,buf
  66.       buff+1
  67.       fcscalc{&fcs,Chr$(buf)}
  68.       i+1
  69.      EndIf
  70.     EndIf
  71.    Until timeout=True          ; repeat forever, unless timeout
  72.   EndIf
  73.  Else
  74.   If buf<0 Then timeout=True
  75.  EndIf
  76.  
  77.  ; could be a timeout error, or some other error
  78.  If timeout=True
  79.   Function Return #TIMEOUT
  80.  Else
  81.   Function Return -1
  82.  EndIf
  83.  
  84. End Function
  85.  
  86. Statement send_frame{buff.l,size.l}
  87.  ;buff is a pointer to a series of bytes
  88.  fcs.l=0
  89.  
  90.  WriteSerial 0,#SYN
  91.  WriteSerial 0,#DLE
  92.  WriteSerial 0,#STX
  93.  
  94.  For i=0 To size-1
  95.   WriteSerial 0,Peek.b(buff+i)&$ff
  96.  
  97.   If Peek.b(buff+i)=#DLE Then WriteSerial 0,#DLE
  98.   fcscalc{&fcs,Chr$(Peek.b(buff+i)&$ff)}
  99.  Next i
  100.  
  101.  WriteSerial 0,#DLE
  102.  WriteSerial 0,#ETX
  103.  
  104.  fcscalc{&fcs,Chr$(#ETX)}
  105.  WriteSerial 0,fcs&$ff
  106.  WriteSerial 0,(fcs&$ff00) ASR 8
  107. End Statement
  108.  
  109. #LR=1
  110. #LD=2
  111. #LT=4
  112. #LA=5
  113. #LN=6
  114. #LNA=7
  115.  
  116. Statement sendLA{nr,cr}
  117.  la$=Chr$(3)+Chr$(5)+Chr$(0)+Chr$(0)
  118.  Poke.b &la$+2,nr
  119.  Poke.b &la$+3,cr
  120.  
  121.  send_frame{&la$,Len(la$)}
  122. End Statement
  123.  
  124. s.w=0
  125. r.w=0
  126.  
  127. Function sendData{d.l,size.l}
  128.  ;data is a pointer to a string of bytes
  129.  ;return -2 (#TIMEOUT) if timeout
  130.  SHARED s,r
  131.  
  132.  timeout=False
  133.  buf$=String$(" ",2048)
  134.  buf2$=String$(" ",2048)
  135.  i.l=0
  136.  
  137.  Poke.b &buf$,2
  138.  Poke.b &buf$+1,4
  139.  Poke.b &buf$+2,s
  140.  
  141.  For i=0 To size-1
  142.   Poke.b &buf$+i+3,Peek.b(d+i)
  143.  Next i
  144.  
  145.  Repeat
  146.   send_frame{&buf$,size+3}
  147.   dummy.l=read_frame{&buf2$}
  148.   If dummy<-1 Then timeout=True
  149.  
  150.   If (Peek.b(&buf2$)=3) & (Peek.b(&buf2$+1)=5) & ((Peek.b(&buf2$+2)&$ff)=s)
  151.    s=(s+1)&$ff
  152.    Function Return size
  153.   Else
  154.    Notify_NewtonRejectsFrame{}
  155.   Else
  156.   EndIf
  157.  Until timeout=True             ; repeat forever, unless timeout
  158.  
  159.  Function Return #TIMEOUT
  160.  
  161. End Function
  162.  
  163. Function receiveData{d.l,size.l}
  164.  ;data is a pointer to a string of bytes
  165.  ;return -2 (#TIMEOUT) if timeout
  166.  SHARED r
  167.  
  168.  buf$=String$(" ",2048)
  169.  ss.l=0
  170.  i.l=0
  171.  
  172.  Repeat
  173.   ss=read_frame{&buf$}
  174.   If ss>0
  175.    sendLA{r,1}
  176.    r=(r+1)&$ff
  177.    If ss>size Then ss=size
  178.    For i=0 To ss-1
  179.     Poke.b d+i,Peek.b(&buf$+i+3)
  180.    Next i
  181.    Function Return ss           ; repeat until valid data received
  182.   EndIf
  183.  Until ss<-1                    ; otherwise repeat forever, unless timeout
  184.  
  185.  Function Return ss
  186.  
  187. End Function
  188.  
  189. Function waitConnection{}
  190.  ; return -2 (#TIMEOUT) if timeout
  191.  SHARED s,r
  192.  timeout.l=False
  193.  buf$=String$(" ",2048)
  194.  
  195.  lr$=Chr$(23)+Chr$(1)+Chr$(2)+Chr$(1)+Chr$(6)+Chr$(1)+Chr$(0)+Chr$(0)+Chr$(0)+Chr$(0)+Chr$(255)+Chr$(2)+Chr$(1)+Chr$(2)
  196.  lr$=lr$+Chr$(3)+Chr$(1)+Chr$(1)+Chr$(4)+Chr$(2)+Chr$(64)+Chr$(0)+Chr$(8)+Chr$(1)+Chr$(3)
  197.  
  198.  Repeat
  199.   dummy.l=read_frame{&buf$}
  200.  Until (dummy>0) OR (dummy<-1)
  201.  If dummy<-1                    ; usually if `-2' i.e. TIMEOUT
  202.   Function Return dummy
  203.  Else
  204.   send_frame{&lr$,Len(lr$)}
  205.  EndIf
  206.  
  207.  r=1
  208.  dummy.l=read_frame{&buf$}
  209.  s=1
  210.  
  211.  Function Return dummy          ; this value could be #TIMEOUT
  212.  
  213. End Function
  214.  
  215. Statement sendDisconnect{}
  216.  
  217.  ld$=Chr$(7)+Chr$(2)+Chr$(1)+Chr$(1)+Chr$(255)+Chr$(2)+Chr$(1)+Chr$(0)
  218.  send_frame{&ld$,Len(ld$)}
  219.  
  220. End Statement
  221.  
  222.